package config

import (
	"bytes"
	"flag"
	"fmt"
	"pipeline/log"
	"strings"
	"sync"
	"time"

	"github.com/sirupsen/logrus"
	"github.com/spf13/viper"
)

var (
	confInstance *Config
	fname        string //配置文件名
	confOnce     sync.Once
)

type Config struct {
	LocalIP         string //本地机器ip
	PythonScriptDir string
	EtcdEndpoints   []string      //etcd集群信息
	EtcdDialTimeout time.Duration //etcd链接超时设置
	KfkWorkerNum    int           //消费协程数
	PythonHandler   struct {      //内嵌脚本模版
		Code string `mapstructure:"code"`
	} `mapstructure:"python_handler"`
	log.LogConfig
}

func init() {
	flag.StringVar(&fname, "c", "conf/conf.toml", "default conf file path")
}

func LoadConfig(config interface{}, defaultData []byte, configFile, envPrefix string) {
	vcfg := viper.New()        //初始化
	vcfg.SetConfigType("toml") //配置文件类型
	_ = vcfg.ReadConfig(bytes.NewBuffer(defaultData))

	if configFile == "" {
		configFile = fname
	}

	vcfg.SetConfigFile(configFile)              // 指定配置文件路径
	if err := vcfg.ReadInConfig(); err != nil { // 查找并读取配置文件
		if _, ok := err.(viper.ConfigFileNotFoundError); ok {
			// 配置文件未找到错误
			panic(fmt.Errorf("conf file not found error: %s", err))
		} else {
			// 配置文件被找到，但产生了另外的错误
			logrus.Error(err.Error())
			panic(fmt.Errorf("other error : %s", err.Error()))
		}
	}

	if envPrefix != "" { //环境变量
		vcfg.SetEnvPrefix(envPrefix)
	}
	vcfg.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
	vcfg.AutomaticEnv()

	if err := vcfg.Unmarshal(config); err != nil {
		panic(fmt.Errorf("fatal error unmarshal config: %s", err))
	}
}

func InitConf(configFile string) *Config {
	var (
		defaultConfigBytes []byte
		envPrefix          string
	)

	confOnce.Do(func() {
		confInstance = &Config{}
		LoadConfig(confInstance, defaultConfigBytes, configFile, envPrefix)
	})
	return confInstance
}
